// src/store/modules/user.ts

import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
import { useRouter } from 'vue-router'

// 导入你封装的 API
import { userLoginApi, getProfileApi, userRegisterApi } from '@/apis/index.js' // 假设你的API在 @/api/user

// 导入 API 参数和响应类型
import type { LoginParams, RegisterParams, ProfileResponse } from '@/types/index.js'

export const useUserStore = defineStore('user', () => {
  const router = useRouter()

  // State
  const token = ref<string | null>(localStorage.getItem('token'))
  const profile = ref<ProfileResponse | null>(null)

  // Getters
  const isLoggedIn = computed(() => !!token.value && !!profile.value)
  const avatar = computed(() => profile.value?.avatar || '')
  const nickname = computed(() => profile.value?.nickName || profile.value?.username || '未设置昵称')

  // Actions

  /**
   * 设置 Token，并存入 localStorage
   * @param newToken
   */
  function setToken(newToken: string) {
    token.value = newToken
    localStorage.setItem('token', newToken)
  }

  /**
   * 清除 Token 和用户信息
   */
  function clearUser() {
    token.value = null
    profile.value = null
    localStorage.removeItem('token')
  }

  /**
   * 获取用户个人资料
   * 如果 token 无效，会自动清除用户信息
   */
  async function fetchProfile() {
    if (!token.value) {
      console.error('fetchProfile called without a token.')
      return
    }
    try {
      const res = await getProfileApi()
      profile.value = res
    } catch (error) {
      console.error('Failed to fetch profile:', error)
      // Token 可能已过期或无效，清除本地状态
      clearUser()
    }
  }

  /**
   * 处理登录逻辑
   * @param loginData 包含 **已加密** 密码的登录数据
   */
  async function handleLogin(loginData: LoginParams) {
    try {
      const res = await userLoginApi(loginData)
      setToken(res.token)
      // 登录成功后立即获取用户信息
      await fetchProfile()
    } catch (error) {
      console.log('Login failed:', error)
      // 抛出错误，以便 UI 层可以捕获并显示提示
      throw error
    }
  }

  /**
   * 处理注册逻辑
   * @param registerData 包含 **已加密** 密码的注册数据
   */
  async function handleRegister(registerData: RegisterParams) {
    try {
      // 1. 调用注册接口
      await userRegisterApi(registerData)
      
      // 2. 注册成功后，自动调用登录
      // 注意：登录接口需要的是和注册时相同的用户名和加密后的密码
      const loginData: LoginParams = {
        username: registerData.username,
        password: registerData.password, // 密码已经是md5加密过的
        loginType: 'username', 
      }
      await handleLogin(loginData)
    } catch (error) {
      console.log('Registration failed:', error)
      throw error
    }
  }

  /**
   * 处理登出逻辑
   */
  function logout() {
    clearUser()
    router.push('/')
  }

  /**
   * 应用启动时，如果存在 token，则自动获取用户信息
   */
  async function init() {
    if (token.value && !profile.value) {
      await fetchProfile()
    }
  }

  // 在 store 初始化时执行
  init()

  return {
    token,
    profile,
    isLoggedIn,
    avatar,
    nickname,
    handleLogin,
    handleRegister,
    logout,
    fetchProfile,
  }
})
